<?php
/**
 * YuToriPHPFramework
 * 処理ルーティングクラス
 * 
 * 基本的に各メソッドは、各設定ファイルで変数をローカル化するためにある。
 * 
 * Singletonパターンデザイン。
 * 
 * @since 2012/01/23
 * @author m.yuki(shinokiwa@gmail.com)
 */
class YuToriRouter {
	/**
	 * Singletonパターン化のため、コンストラクタは封印
	 * 
	 * @since 2012/01/23
	 * @author m.yuki(shinokiwa@gmail.com)
	 */
	private function __construct () {
		
	}
	
	/**
	 * Singletonインスタンスを取得する
	 * 
	 * @since 2012/01/23
	 * @author m.yuki(shinokiwa@gmail.com)
	 */
	static function getInstance () {
		static $instance;
		if (empty ($instance)) {
			$instance = new YuToriRouter ();
		}
		
		return $instance;
	}
	
	/**
	 * 実際にルーティングする
	 * 
	 * @since 2012/01/23
	 * @author m.yuki(shinokiwa@gmail.com)
	 */
	static function execute ($Mode = 'WEB') {
		$objRouter = YuToriRouter::getInstance();

		// モード値が定義されていない場合、定義しておく
		if (!defined ('YUTORI_MODE')) define ('YUTORI_MODE', $Mode);

		// 環境変数の定義ぷらすあるふぁ
		
		if (YUTORI_MODE == 'WEB') {
			// リソース削減のため、internal dummy connectionの場合は即時終了
			if (0 === strcasecmp(@$_SERVER['HTTP_USER_AGENT'], 'Apache (internal dummy connection)')) exit();

			// Web側しか持っていないオブジェクトの生成
			$Route = Y()->add('Server', $_SERVER);
			$Route = Y()->add('Post', $_POST);
			$Route = Y()->add('Get', $_GET);
		}

		$Route = Y()->add('Env', $_ENV);

		// デフォルトのトップレベルオブジェクトを生成する
		// トップレベルはUtil以外全てarray型なのでcall時は注意。
		include (DIR_SYSTEMS.'/util.php');
		$Route = Y()->add('Route', array());
		Y()->add('Config', array());
		Y()->add('Module', array());
		Y()->add('Model', array());
		Y()->add('View', array());
		Y()->add('Controll', array());

		Y::file(DIR_APP."/app.php")->call();

		// Routeをcallする
		$Route->call();
	}
}